#include "tlv.h"
#include "client.h"
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <strings.h>

int main(int argc,char* argv[])
{
    ARGS_CHECK(argc,3);
    
    //函数定义
    char directive[100]; //直接输入的命令
    char command[50] = {0}; //命令
    char parameter[256] = {0}; //命令后参数
    int num;
    tlv_msg_t msg;
    stdin_msg_t stdin_msg;
    char buff[1024];    
    char curPath[100] = "/"; //当前的路径
    tlv_msg_t user_msg;
    tlv_msg_t password_msg;
    tlv_msg_t recv_msg;
    int sockfd = tcpInit(argv[1],argv[2]);
    while(1){
        bzero(&user_msg,sizeof(tlv_msg_t));
        bzero(&password_msg,sizeof(tlv_msg_t));
        bzero(&recv_msg,sizeof(tlv_msg_t));
        printf("请输入用户名：");
        char username[50];
        fgets(username, sizeof(username), stdin);
        username[strcspn(username, "\n")] = 0; // 去除换行符
        
        printf("请输入密码：");
        char password[50];
        fgets(password, sizeof(password), stdin);
        password[strcspn(password, "\n")] = 0; // 去除换行符
        
        tlv_create(&user_msg, 12, strlen(username), username);
        tlv_create(&password_msg, 12, strlen(password), password);
        tlv_send(sockfd, &user_msg);
        tlv_send(sockfd, &password_msg);
        tlv_recv(sockfd, &recv_msg); 
        if (recv_msg.hdr.type == 13) {
            printf("%s\n",recv_msg.value);
            break; // 认证成功，跳出循环
            } else if(recv_msg.hdr.type == 14){
               printf("%s\n",recv_msg.value);
            printf("请重新输入用户名和密码进行认证。\n");
            continue;
    }
}

    printf("=== 认证成功！欢迎进入小9窝的网盘系统 ===\n");
    printf("cd：进入对应目录\n");
    printf("ls：列出相应目录文件\n");
    printf("pwd：显示当前文件的绝对路径\n");
    printf("puts：将本地文件上传到服务器\n");
    printf("gets：将服务器文件下载到本地\n");
    printf("mkdir：在服务器中创建文件夹\n");
    printf("rmdir：移除服务器中的指定文件夹\n");
    printf("quit：退出程序\n");

    while(1)
    {
        printf("[小9窝]> ");
        fflush(stdout);
        
        // 清空缓冲区
        bzero(directive, sizeof(directive));
        bzero(command, sizeof(command));
        bzero(parameter, sizeof(parameter));
        bzero(&msg, sizeof(tlv_msg_t));
        bzero(buff, sizeof(buff));
        bzero(&stdin_msg, sizeof(stdin_msg_t));

        // 读取用户输入
        if (fgets(directive, sizeof(directive), stdin) == NULL) {
            if (feof(stdin)) {
                printf("\n检测到EOF，退出程序\n");
                close(sockfd);
                exit(0);
            }
            continue;
        }

        // 移除换行符
        directive[strcspn(directive, "\n")] = 0;

        // 跳过空行
        if (strlen(directive) == 0) {
            continue;
        }

        // 解析命令和参数
        char *first_token = strtok(directive, " ");
        if (first_token != NULL) {
            strncpy(command, first_token, sizeof(command) - 1);
            command[sizeof(command) - 1] = '\0';
            
            // 获取剩余部分作为参数
            char *remainder = strtok(NULL, "");
            if (remainder != NULL) {
                // 去除参数前导空格
                while (*remainder == ' ') {
                    remainder++;
                }
                if (strlen(remainder) > 0) {
                    strncpy(parameter, remainder, sizeof(parameter) - 1);
                    parameter[sizeof(parameter) - 1] = '\0';
                }
            }
        }

        num = enumInt(command);
        if (num == -1) {
            printf("未知命令: %s\n", command);
            continue;
        }
        
        int param_length = 0;
        const char *param_value = "";
        
        if (strlen(parameter) > 0) {
            param_length = strlen(parameter);
            param_value = parameter;
        }
        
        // ls命令如果没有参数，默认使用当前路径
        if (num == CMD_LS && param_length == 0) {
            param_length = strlen(curPath);
            param_value = curPath;
        }
        
        
        stdin_msg.type = num;
        strncpy(stdin_msg.value, param_value, param_length);
        stdin_msg.value[param_length] = '\0';
        
        stdinChommod(sockfd,stdin_msg);// 处理用户输入的命令
        
       if (num == CMD_CD && strlen(parameter) > 0) {
            // 更新当前路径
            if (parameter[0] == '/') {
                // 绝对路径
                strncpy(curPath, parameter, sizeof(curPath) - 1);
                curPath[sizeof(curPath) - 1] = '\0';
            } else {
                // 相对路径
                if (strcmp(parameter, "..") == 0) {
                    // 返回上一级目录
                    char *last_slash = strrchr(curPath, '/');
                    if (last_slash != NULL && last_slash != curPath) {
                        *last_slash = '\0';
                    } else {
                        // 已经在根目录，保持不变
                        strcpy(curPath, "/");
                    }
                } else {
                    // 进入子目录
                    if (strcmp(curPath, "/") != 0) {
                        strncat(curPath, "/", sizeof(curPath) - strlen(curPath) - 1);
                    }
                    strncat(curPath, parameter, sizeof(curPath) - strlen(curPath) - 1);
                }
            }
        } 
    }
    close(sockfd);
    return 0;
}